Regulßrnφ v²razy

PSPad od verze 3.6.0 podporuje hledßnφ pomocφ regulßrnφch v²raz∙

Co jsou to regulßrnφ v²razy ?

Regulßrnφ v²razy jsou mocn² nßstroj pro hledßnφ textov²ch °et∞zc∙ pomocφ vzor∙. Specißlnφ p°eddefinovanΘ metaznaky dovolujφ specifikovat, zda hledan² °et∞zec le₧φ na zaΦßtku nebo na konci textu / °ßdku, umo₧≥uje specifikovat znaky, kter² °et∞zec obsahuje apod.
Z poΦßtku vßm to urΦit∞ bude p°ipadat slo₧itΘ, ale po seznßmenφ zjistφte, ₧e je to velmi u₧iteΦn² nßstroj.

JednoduchΘ znaky
Ka₧d² znak zastupuje sebe. Je to jako p°i normßlnφm hledßnφ. Pokud zadßte slovo jelen, bude se hledat "jelen". Escape sekvence zaΦφnß znakem \. Existujφ n∞kterΘ specißlnφ znaky, nap°. ^, kter² znamenß, ₧e se bude hledat na zaΦßtku °ßdku. Pokud ale budete chtφt p°φmo znak ^, musφte zadat \^. Podobn∞ pro hledßnφ samotnΘho znaku \ je t°eba zadat \\.

Escape sekvence
Znaky m∙₧ou b²t specifikovßny pomocφ escape sekvence. \n je nov² °ßdek, \t tabulßtor apod. Znaky je mo₧nΘ takΘ zadat pomocφ jejich ASCII hodnoty. \xnn je hledßnφ znaku, kde nn je jeho ASCII hodnota vyjßd°enß v ÜestnßctkovΘ soustav∞.

\xnn znak s Üestnßctkovou ASCII hodnotou nn  
\t   tabulßtor (stejnΘ jako \x09  
\n   nov² °ßdek, stejnΘ jako \x0a  
\r   CR, stejnΘ jako\x0d  
\f   FF, stejnΘ jako \x0c  
\a   BEL, stejnΘ jako \x07  
\e   ESC, stejnΘ jako \x1b  

P°φklady:

jel\x20en najde slovo "jel en" (s mezerou uprost°ed)  
\tjelen   najde slovo "jelen", p°ed kter²m je tabulßtor  

Skupiny (t°φdy) znak∙

Je mo₧nΘ specifikovat skupiny znak∙. Tato skupina je uzav°ena v
[]
. Text bude nalezen, pokud vyhovuje jeden znak ze seznamu. Pokud prvnφ znak za zßvorkou je ^, znamenß to, ₧e v textu nesmφ b²t obsa₧en ₧ßdn² znak ze seznamu.

P°φklady:
jel[aei]n najde slova "jelan", "jelen", "jelin"  
jel[^ai]n najde slovo "jelen", ale nenajde "jelin", "jelan" atd.  

Znak
-
znamenß rozsah znak∙. Potom a-z znamenß jak²koliv znak v rozsahu "a" a₧ "z".
Pokud chcete hledat znak
- samotn², je t°eba jej uvΘst na zaΦßtku / konci seznamu, nebo jej uvΘst pomocφ \.

P°φklady:
[-az]     vyhovujφ znaky "a", "z" a "-"  
[az-]     vyhovujφ znaky "a", "z" a "-"  
[a\-z]    vyhovujφ znaky "a", "z" a "-"  
[a-z]     vyhovujφ vÜechny znaky v rozsahu "a" a₧ "z"  
[\n-\x0D] vyhovujφ znaky s ASCII hodnotou #10,#11,#12,#13  
[\d-t]    vyhovujφ Φφsla, "-" a "t"  
[]-a]     vyhovuje znak v rozsahu "]" a₧ "a"  

Metaznaky - odd∞lovaΦe °ßdk∙

^  zaΦßtek °ßdku  
$  konec °ßdku  
\A zaΦßtek textu  
\Z konec textu  
.  jak²koliv znak  

P°φklady:
^jelen   "jelen", ale pouze pokud je na zaΦßtku °ßdku  
jelen$   "jelen", lae pouze pokud je na konci °ßdku  
^jelen$  "jelen", ale pouze pokud na °ßdku nenφ nic jinΘho  
jele.n   "jel"jak²koliv_znak"n"  

Metaznaky - p°eddefinovanΘ skupiny

\w pφsmena vΦetn∞ "_" an alphanumeric character (including "_")  
\W Φφsla a pφsmena  
\d Φφsla  
\D neΦφselnΘ znaky  
\s jakßkoliv mezera (stejnΘ jako [ \t\n\r\f])  
\S nemezerov² znak  

P°φklady:
jel\dn     znamenß "jel1n", "jel7n", ale ne "jelen"  
jel[\w\s]n znamenß "jelen", "jel n", ale ne "jel2n", "jel=n" apod.  

Metaznaky - ΦφtaΦe

Jak²koliv znak m∙₧e b²t nßsledovßn ΦφtaΦem. Lze tak urΦit poΦet v²skyt∙ p°edchozφho znaku, metaznaku nebo v²razu.

hladovΘ

*      ₧ßdn² nebo vφce v²skyt∙ znaku, podobn∞ jako {0,}  
+      jeden nebo vφce v²skyt∙ znaku, podobn∞ jako {1,}  
?      ₧ßdn² nebo jeden v²skyt znaku, podobn∞ jako {0,1}  
{n}    p°esn∞ n v²skyt∙  
{n,}   nejmΘn∞ n v²skyt∙  
{n,m}  nejmΘn∞ n-krßt, ale ne vφc ne₧ m-krßt  
nehladovΘ
*?     ₧ßdn² nebo vφce v²skyt∙, podobn∞ jako {0,}?  
+?     jeden nebo vφce v²skyt∙, podobn∞ jako {1,}?  
??     ₧ßdn² nebo jeden v²skyt, podobn∞ jako {0,1}?  
{n}?   p°esn∞ n v²skyt∙  
{n,}?  nejmΘn∞ n v²skyt∙  
{n,m}? nejmΘn∞ n-krßt, ale ne vφc ne₧ m-krßt  

P°φklady:
jel.*n     najde "jelen", "jel87hsgdn", "jeln"...  
jel.+n     najde "jelen", "jel87hsgdn", ale ne "jeln"  
jel.?n     najde "jelen", "jeln", ale ne "jel87hsgdn"  
jele{2}n   najde "jeleen"  
jele{2,}n  najde "jeleen", "jeleeen", "jeleeeen"...  
jele{2,3}n najde "jeleen", "jeleeen", ale ne "jeleeeen"  

MalΘ vysv∞tlenφ o "hladovosti". "Hladov²" vracφ tolik, kolik je mo₧nΘ. "Nehladov²" vracφ tak mßlo, jak je mo₧nΘ. Nap°.
b+
a b*
aplikovanΘ na °et∞zec 'abbbbc' vracφ 'bbbb', b+?
vracφ 'b', b*?
vrßtφ prßzdn² °et∞zec, b{2,3}?
vrßtφ 'bb', b{2,3}
vrßtφ 'bbb'.

Metaznaky - alternativy

Ve vzoru lze takΘ specifikovat sΘrii alternativ, jako odd∞lovaΦ slou₧φ znak
|
.
Nap°.
jelen|jelan|jelin
najde "jelen", "jelan" nebo "jelin" (podobn∞ jako jel(e|a|i)n
)
Nezapome≥te ale na to, ₧e znak
|
uvnit° [] je interpretovßn jako obyΦejn² znak !!!
Pokud tedy uvedete
[jelen|jelan|jelin], ve skuteΦnosti jste zadali, ₧e chcete hledat jeden ze znak∙ "jeln|ai"

P°φklad:
jel(en|φnek) najde "jelen" nebo "jelφnek"  

Metaznaky - vno°enΘ v²razy

Konstrukce
(...) m∙₧e b²t pou₧ita takΘ pro definici vno°en²ch v²raz∙.

P°φklady:
(jelen){8,10}  najde °et∞zec, kter² obsahuje 8, 9 nebo 10 v²skyt∙ "jelen"  
jel([0-9]|e+)n najde "jel0n", "jel3n", "jelen", "jeleen", "jeleeen" ...  

Metaznaky - zp∞tnΘ reference

Metaznaky od \1 do \9 jsou interpretovßny jako zp∞tnß reference.

P°φklady:
(.)\1+         najde "aaaa" a "cc" (2 a vφce stejn²ch znak∙)  
(.+)\1+        najde "abab" a "123123" (opakujφcφ se posloupnosti znak∙)  
(['"]?)(\d+)\1 najde '"13" (v dvojit²ch uvozovkßch) nebo '4' (jednoduch²ch uvozovkßch) nebo 77  



Pßr p°φklad∙ z praxe:

Hledßnφ
·nalezenφ slov, zaΦφnajφcφch na "o": (^|\s)o.*?($\s)  
·hledßme 6-mφstnß Φφsla, kterß majφ na 3.mφst∞ "5": \d\d5\d\d\d  
·mßme sloupec Φφsel (na ka₧dΘm °ßdku jedno) a hledßme 2 a₧ 4-mφstnß: ^\d{2,4}$  
·hledßme zßpornß Φφsla: -\d{1,}  
·hledßme Φas ve tvaru hh:mm: ([0-9]{2}):([0-9]{2})  

Nahrazovßnφ
regulßrnφ v²razy umo₧≥ujφ pou₧φt v nahrazovßnφ i Φßsti hledan²ch °et∞zc∙. Shluky znak∙, uzav°enΘ v zßvorkßch v Φßsti hledat jsou vrßceny v prom∞nn²ch $1..$n, tak₧e je mo₧nΘ je pou₧φt v nahradit. Viz nßsledujφcφ p°φklady:

·zm∞na formßtu data z dd.mm.yyyy na yyyy-mm-dd  
hledat: ([0-9]{2}).([0-9]{2}).([0-9]{4})  
nahradit: $3-$2-$1  
·mßme Φas ve formßtu hh:mm a chceme jej nahradit za mm-hh  
hledat: ([0-9]{2}):([0-9]{2})  
nahradit: $2-$1  
·mßme Φφsla, odd∞lenß ";" a pot°ebujeme je dostat ka₧dΘ na zvlßÜtnφ °ßdek  
hledat: ;  
nahradit: \n  
upozorn∞nφ: kurzor na konec textu a hledat sm∞rem "vzad"  
·chceme v textu umφstit ka₧dΘ slovo na zvlßÜtnφ °ßdek  
hledat: \s+  
nahradit: \n  
upozorn∞nφ: kurzor na konec textu a hledat sm∞rem "vzad"  

Komplexn∞jÜφ p°φpad z praxe
M∞l jsem seznam tag∙ ve tvaru
tag - popis
Pot°eboval jsem jej dostat do definice pole ve tvaru a[index] := 'tag';
1.zbavφme se popisu, tak₧e nahradφme -.* za "nic"  
2.pomocφ vlo₧enφ Φφslovßnφ do °ßdk∙ jsem si nechal na zaΦßtek ka₧dΘho °ßdku vlo₧it Φφslo s dv∞mi Φφslicemi. Tak₧e seznam vypadal n∞jak takto: nn. tag  
3.pomocφ dalÜφho nahrazenφ ([0-9]{2})\..(.*) za a[$1] := '$2'; jsem dosßhl v²slednΘho tvaru  



Pro vysv∞tlenφ syntaxe byl pou₧it (p°elo₧en) text z nßpov∞dy k implementaci regulßrnφch v²raz∙ od Andrey V. Sorokina (http://anso.virtualave.net)